package serveur;

import java.io.*;
import java.util.*;

import moyenDeTransport.Trajet;
import moyenDeTransport.Vehicule;
import moyenDeTransport.Ville;

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
/**
 * Cette classe fait partie de l'application d'un système de réservation de
 * moyens de transport en commun. Cette classe implémente la classe abstraite
 * Serveur. Elle implémente les méthodes sauvegarder et charger. Pour lire et
 * écrire les données, on va se servir ici d'un fichier XML
 * 

 * 
 * @author Simon Fauconnier

 */
public class ServeurV3 extends Serveur implements Serializable {

    private static Element racine;
    private static org.jdom.Document document;

    // on hérite de toute les données du serveur
    public ServeurV3() {
        super();
        racine = new Element("Liste");
        document = new Document(racine);
    }

    public boolean sauvegarder() throws IOException {

        racine.removeChildren("Trajets");
        racine.removeChildren("Vehicules");

        Element trajets = new Element("Trajets");
        racine.addContent(trajets);

        Element vehicules = new Element("Vehicules");
        racine.addContent(vehicules);

        for (int i = 0; i < mesTrajets.size(); i++) {

            Element trajet1 = new Element("Trajet");
            trajets.addContent(trajet1);

            Element villeDepart = new Element("Depart");
            trajet1.addContent(villeDepart);
            villeDepart.setText(""
                    + mesTrajets.get(i).getDepart().getCodeVille());

            Element villeArrivee = new Element("Arrivee");
            trajet1.addContent(villeArrivee);
            villeArrivee.setText(""
                    + mesTrajets.get(i).getArrivee().getCodeVille());

            Element dateDepart = new Element("DateDepart");
            trajet1.addContent(dateDepart);

            Element date1 = new Element("Date");
            dateDepart.addContent(date1);
            date1.setText(calendarToDate(mesTrajets.get(i).getDateDepart()));

            Element heure1 = new Element("Heure");
            dateDepart.addContent(heure1);
            heure1.setText(calendarToTime(mesTrajets.get(i).getDateDepart()));

            Element dateArrivee = new Element("DateArrivee");
            trajet1.addContent(dateArrivee);

            Element date2 = new Element("Date");
            dateArrivee.addContent(date2);
            date2.setText(calendarToDate(mesTrajets.get(i).getDateArrivee()));

            Element heure2 = new Element("Heure");
            dateArrivee.addContent(heure2);
            heure2.setText(calendarToTime(mesTrajets.get(i).getDateArrivee()));

            Element vehicule = new Element("Vehicule");
            trajet1.addContent(vehicule);
            vehicule.setText(mesTrajets.get(i).getVehicule().getVehicule());

            Element premiere = new Element("PremiereClasse");
            vehicule.addContent(premiere);
            premiere.setText("" + mesVehicules.get(i).getPremiereClasse());

            Element seconde = new Element("SecondeClasse");
            vehicule.addContent(seconde);
            seconde.setText("" + mesVehicules.get(i).getSecondeClasse());

            Element eco = new Element("ClasseEco");
            vehicule.addContent(eco);
            eco.setText("" + mesVehicules.get(i).getClasseEco());

            Element ident = new Element("Identifiant");
            vehicule.addContent(ident);
            ident.setText("" + mesTrajets.get(i).getVehicule().getIdentifiant());

            Element prix = new Element("Prix");
            trajet1.addContent(prix);
            prix.setText("" + mesTrajets.get(i).getPrix());

            Element couchette = new Element("Couchette");
            trajet1.addContent(couchette);
            couchette.setText("" + mesTrajets.get(i).isCouchette());

            Element repas = new Element("Repas");
            trajet1.addContent(repas);
            repas.setText("" + mesTrajets.get(i).isRepas());

            Element placesPremieres = new Element("PlacesPremieres");
            trajet1.addContent(placesPremieres);
            placesPremieres
                    .setText("" + mesTrajets.get(i).getPlacesPremieres());

            Element placesSeconde = new Element("PlacesSeconde");
            trajet1.addContent(placesSeconde);
            placesSeconde.setText("" + mesTrajets.get(i).getPlacesSeconde());

            Element placesEco = new Element("PlacesEco");
            trajet1.addContent(placesEco);
            placesEco.setText("" + mesTrajets.get(i).getPlacesEco());

            Element identifiant = new Element("Identifiant");
            trajet1.addContent(identifiant);
            identifiant.setText("" + mesTrajets.get(i).getIdentifiant());

        }

        for (int i = 0; i < mesVehicules.size(); i++) {

            Element vehicule = new Element("Vehicule");
            vehicules.addContent(vehicule);

            vehicule.setText(mesVehicules.get(i).getVehicule());

            Element premiere = new Element("PremiereClasse");
            vehicule.addContent(premiere);
            premiere.setText("" + mesVehicules.get(i).getPremiereClasse());

            Element seconde = new Element("SecondeClasse");
            vehicule.addContent(seconde);
            seconde.setText("" + mesVehicules.get(i).getSecondeClasse());

            Element eco = new Element("ClasseEco");
            vehicule.addContent(eco);
            eco.setText("" + mesVehicules.get(i).getClasseEco());

            Element ident = new Element("Identifiant");
            vehicule.addContent(ident);
            ident.setText("" + mesVehicules.get(i).getIdentifiant());

        }

        this.enregistre();
        return true;

    }

    public boolean charger() throws Exception {

        try {

            lireFichier();

            mesTrajets = new ArrayList<Trajet>();
            mesVehicules = new ArrayList<Vehicule>();

            Element vehicules = racine.getChild("Vehicules");

            List listVehicules = vehicules.getChildren("Vehicule");
            Iterator j = listVehicules.iterator();

            Element trajets = racine.getChild("Trajets");

            List listTrajet = trajets.getChildren("Trajet");
            Iterator i = listTrajet.iterator();

            while (j.hasNext()) {

                Element courant = (Element) j.next();

                String nameVehicule = courant.getText();

                int ident = Integer.parseInt(courant
                        .getChildText("Identifiant"));

                int premiereClasse = Integer.parseInt(courant
                        .getChildText("PremiereClasse"));
                int secondeClasse = Integer.parseInt(courant
                        .getChildText("SecondeClasse"));
                int classeEco = Integer.parseInt(courant
                        .getChildText("ClasseEco"));

                Vehicule vehic = new Vehicule(nameVehicule, premiereClasse,
                        secondeClasse, classeEco, ident);

                mesVehicules.add(vehic);

            }

            while (i.hasNext()) {

                Element courant = (Element) i.next();

                Calendar dateDepart1 = textToCalendar(
                        courant.getChild("DateDepart").getChildText("Date"),
                        courant.getChild("DateDepart").getChildText("Heure"));

                Calendar dateArrivee1 = textToCalendar(
                        courant.getChild("DateArrivee").getChildText("Date"),
                        courant.getChild("DateArrivee").getChildText("Heure"));

                float prix = Float.parseFloat(courant.getChildText("Prix"));
                Boolean couchette = Boolean.parseBoolean(courant
                        .getChildText("Couchette"));
                Boolean repas = Boolean.parseBoolean(courant
                        .getChildText("Repas"));

                String nameVehicule = courant.getChildText("Vehicule");

                int premiereClasse = Integer.parseInt(courant.getChild(
                        "Vehicule").getChildText("PremiereClasse"));
                int secondeClasse = Integer.parseInt(courant.getChild(
                        "Vehicule").getChildText("SecondeClasse"));
                int classeEco = Integer.parseInt(courant.getChild("Vehicule")
                        .getChildText("ClasseEco"));
                int ident = Integer.parseInt(courant.getChild("Vehicule")
                        .getChildText("Identifiant"));

                Vehicule vehic = new Vehicule(nameVehicule, premiereClasse,
                        secondeClasse, classeEco, ident);

                int codeVilleDepart = Integer.parseInt(courant
                        .getChildText("Depart"));
                int codeVilleArrivee = Integer.parseInt(courant
                        .getChildText("Arrivee"));

                Ville villeDepart = Ville.values()[codeVilleDepart];

                Ville villeArrivee = Ville.values()[codeVilleArrivee];

                int identifiant = Integer.parseInt(courant
                        .getChildText("Identifiant"));
                ;

                Trajet trajet1 = new Trajet(dateDepart1, dateArrivee1,
                        villeDepart, villeArrivee, vehic, identifiant, prix,
                        couchette, repas, premiereClasse, secondeClasse,
                        classeEco);

                mesTrajets.add(trajet1);
            }

            return true;
        } catch (Exception e) {

            System.out.println("Problème de lecture. ");
            return false;
        }

    }

    private void enregistre() {
        try {

            XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());

            sortie.output(document, new FileOutputStream("dataV3.xml"));
        } catch (java.io.IOException e) {
        }
    }

    private void lireFichier() throws Exception {
        SAXBuilder sxb = new SAXBuilder();
        document = sxb.build(new File("dataV3.xml"));
        racine = document.getRootElement();
    }
}
